/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.edu.uch.syscom.managedbeans;

import java.io.*;
import java.util.*;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;
import pe.edu.uch.syscom.managedbeans.uibeans.UIColumnBean;
import pe.edu.uch.syscom.managedbeans.uibeans.UIReporteBean;
import pe.edu.uch.syscom.mapping.TbProducto;
import pe.edu.uch.syscom.mapping.TbRolReporte;
import pe.edu.uch.syscom.mapping.TbUsuario;
import pe.edu.uch.syscom.utils.CommonDAO;
import pe.edu.uch.syscom.utils.CommonWeb;
import pe.edu.uch.syscom.utils.ConstantesWeb;
import pe.edu.uch.syscom.utils.Print;

/**
 *
 * @author Jose Tejada
 */
public class ModReportesMB {

    private int m_iIdReporte;
    private int m_iIdUsuario;
    private double m_dMontoTotal;
    private String m_sOncomplete;
    private String m_sTipoReporte;
    private Calendar m_fechaInicio = Calendar.getInstance();
    private Calendar m_fechaFin = Calendar.getInstance();
    private SelectItem[] m_lstReportes;
    private SelectItem[] m_lstUsuarios;
    private List<List<String>> m_lstFilasReporte;
    private List<UIColumnBean> m_lstCabeceraColumnas;

    /**
     * Creates a new instance of ModReportesMB
     */
    public ModReportesMB() {
    }

    public int getIdReporte() {
        return m_iIdReporte;
    }

    public void setIdReporte( int iIdReporte ) {
        m_iIdReporte = iIdReporte;
    }

    public int getIdUsuario() {
        return m_iIdUsuario;
    }

    public void setIdUsuario( int iIdUsuario ) {
        m_iIdUsuario = iIdUsuario;
    }

    public double getMontoTotal() {
        return m_dMontoTotal;
    }

    public void setMontoTotal( double dMontoTotal ) {
        m_dMontoTotal = dMontoTotal;
    }

    public String getOncomplete() {
        return m_sOncomplete;
    }

    public String getTipoReporte() {
        m_sTipoReporte = "prueba.pdf";
        return m_sTipoReporte;
    }

    public void setTipoReporte( String sTipoReporte ) {
        this.m_sTipoReporte = sTipoReporte;
    }

    public void setOncomplete( String m_sOncomplete ) {
        this.m_sOncomplete = m_sOncomplete;
    }

    public Date getFechaFin() {
        return m_fechaFin.getTime();
    }

    public void setFechaFin( Date fFin ) {
        this.m_fechaFin.setTime( fFin );
    }

    public Date getFechaInicio() {
        return m_fechaInicio.getTime();
    }

    public void setFechaInicio( Date fInicio ) {
        this.m_fechaInicio.setTime( fInicio );
    }

    public SelectItem[] getLstReportes() {
        int i;
        int iSizeRep;
        TbRolReporte tbRolRep;
        TbUsuario tbUsuario;
        Iterator<TbRolReporte> it;
        tbUsuario = CommonWeb.getUsuarioSesion();

        iSizeRep = tbUsuario.getTbRol().getTbRolReportes().size();

        m_lstReportes = new SelectItem[ iSizeRep + 1 ];
        if ( iSizeRep > 0 ) {
            i = 0;
            it = tbUsuario.getTbRol().getTbRolReportes().iterator();
            while ( it.hasNext() ) {
                tbRolRep = it.next();
                m_lstReportes[++i] = new SelectItem( tbRolRep.getTbReporte().getIdReporte(), tbRolRep.getTbReporte().getNomReporte() );
            }
        }
        m_lstReportes[0] = new SelectItem( "0", "[Seleccione Reporte]" );
        return m_lstReportes;
    }

    public void setLstReportes( SelectItem[] lstReportes ) {
        m_lstReportes = lstReportes;
    }

    public SelectItem[] getLstUsuarios() {
        int iSizeUsu;
        TbUsuario usuAux;
        TbUsuario usuLog;
        List<TbUsuario> lstUsuario;
        try {
            usuLog = CommonWeb.getUsuarioSesion();
            if ( ConstantesWeb.TIPO_USUARIO_ADMIN.equals( usuLog.getTipoUsuario() ) ) {
                lstUsuario = CommonDAO.getTbUsuarioDAO().listarUsuarios();
            } else {
                lstUsuario = new ArrayList<TbUsuario>();
                lstUsuario.add( usuLog );
            }
            m_iIdUsuario = usuLog.getIdUsuario();
        } catch ( Exception ex ) {
            ex.printStackTrace();
            lstUsuario = new ArrayList<TbUsuario>();
        }

        iSizeUsu = lstUsuario.size();
        m_lstUsuarios = new SelectItem[ iSizeUsu ];
        for ( int i = 0; i < iSizeUsu; i++ ) {
            usuAux = lstUsuario.get( i );
            m_lstUsuarios[i] = new SelectItem( usuAux.getIdUsuario(), usuAux.getUsuario() );
        }
        return m_lstUsuarios;
    }

    public void setLstUsuarios( SelectItem[] lstUsuarios ) {
        m_lstUsuarios = lstUsuarios;
    }

    public List<List<String>> getLstReporte() {
        return m_lstFilasReporte;
    }

    public void setLstReporte( List<List<String>> lstFilasReporte ) {
        m_lstFilasReporte = lstFilasReporte;
    }

    public List<UIColumnBean> getLstCabeceraColumnas() {
        generarTablaReporte( null );
        return m_lstCabeceraColumnas;
    }

    public void setLstCabeceraColumnas( List<UIColumnBean> lstCabeceraColumnas ) {
        m_lstCabeceraColumnas = lstCabeceraColumnas;
    }

    //FIN SETTERS Y GETTERS
    public void generarTablaReporte( ActionEvent event ) {
        int iCont;
        List<String> lstFila;
        List<UIReporteBean> lstUIReporte;

        m_lstFilasReporte = new ArrayList<List<String>>();
        m_lstCabeceraColumnas = new ArrayList<UIColumnBean>();
        if ( m_iIdReporte != 0 ) {
            switch ( m_iIdReporte ) {
                case ConstantesWeb.RPT_VENTAS_X_FECHA_Y_USUARIO:
                    m_lstCabeceraColumnas.add( new UIColumnBean( "Nro." ) );
                    m_lstCabeceraColumnas.add( new UIColumnBean( "ID" ) );
                    m_lstCabeceraColumnas.add( new UIColumnBean( "Monto" ) );
                    m_lstCabeceraColumnas.add( new UIColumnBean( "Cant. Items" ) );
                    m_lstCabeceraColumnas.add( new UIColumnBean( "F. Venta" ) );
                    m_lstCabeceraColumnas.add( new UIColumnBean( "Cliente" ) );
                    m_lstCabeceraColumnas.add( new UIColumnBean( "Usario" ) );

                    lstUIReporte = CommonDAO.getTBReporteDAO().listarReporte( m_fechaInicio, m_fechaFin, m_iIdUsuario, m_iIdReporte );
                    m_dMontoTotal = 0;
                    if ( !lstUIReporte.isEmpty() ) {
                        iCont = 0;
                        for ( UIReporteBean rb : lstUIReporte ) {
                            lstFila = new ArrayList<String>();
                            lstFila.add( (++iCont) + "" );//CONT
                            lstFila.add( rb.getExpr1() );//ID
                            lstFila.add( rb.getExpr2() );//MONTO
                            lstFila.add( rb.getExpr3() );//CANTIDAD
                            lstFila.add( rb.getExpr4() );//FECHA DE VENTA
                            lstFila.add( rb.getExpr5() );//CLIENTE
                            lstFila.add( rb.getExpr6() );//USUARIO

                            m_dMontoTotal += Double.parseDouble( rb.getExpr2() );

                            m_lstFilasReporte.add( lstFila );
                        }
                    }
                    break;
                case ConstantesWeb.RPT_VENTAS_X_FECHA_Y_PRODUCTO:
                    m_lstCabeceraColumnas.add( new UIColumnBean( "Nro." ) );
                    m_lstCabeceraColumnas.add( new UIColumnBean( "Prod." ) );
                    m_lstCabeceraColumnas.add( new UIColumnBean( "Prec. Venta" ) );
                    m_lstCabeceraColumnas.add( new UIColumnBean( "Cant. Vend." ) );
                    m_lstCabeceraColumnas.add( new UIColumnBean( "Mont. Estim." ) );
                    m_lstCabeceraColumnas.add( new UIColumnBean( "Mont. Rec." ) );
                    m_lstCabeceraColumnas.add( new UIColumnBean( "Monto. Desc." ) );
                    m_lstCabeceraColumnas.add( new UIColumnBean( "Stock" ) );

                    lstUIReporte = CommonDAO.getTBReporteDAO().listarReporte( m_fechaInicio, m_fechaFin, m_iIdUsuario, m_iIdReporte );
                    m_dMontoTotal = 0;
                    if ( !lstUIReporte.isEmpty() ) {
                        iCont = 0;
                        for ( UIReporteBean rb : lstUIReporte ) {
                            lstFila = new ArrayList<String>();
                            lstFila.add( (++iCont) + "" );
                            lstFila.add( rb.getExpr1() );//PRODUCTO
                            lstFila.add( rb.getExpr2() );//PRECIO VENTA
                            lstFila.add( rb.getExpr3() );//CANTIDAD
                            lstFila.add( rb.getExpr4() );//MONTO ESTIMADO
                            lstFila.add( rb.getExpr5() );//MONTO RECAUDADO
                            lstFila.add( rb.getExpr6() );//MONTO DESCONTADO
                            lstFila.add( rb.getExpr7() );//STOCK

                            m_dMontoTotal += Double.parseDouble( rb.getExpr5() );

                            m_lstFilasReporte.add( lstFila );
                        }
                    }
                    break;



            }
        }
    }

    public void imprimirFicha( ActionEvent event ) {
        m_sOncomplete = "Richfaces.showModalPanel('mp_reporte')";
    }

    public synchronized void cargarReporte( OutputStream out, Object data ) throws IOException, Exception, EOFException {
        int iSize;
        Calendar fFin = Calendar.getInstance();
        String jasper;
        ByteArrayOutputStream buffer;
        FacesContext context;
        HashMap parametros;
        InputStream input;
        Print print;
        byte[] abBytes;
        byte[] abPdf;
        try {
            if ( data == null || m_iIdReporte == 0 ) {
                return;
            }
            context = FacesContext.getCurrentInstance();

            parametros = new HashMap();
            fFin.setTime( m_fechaFin.getTime() );
            
            parametros.put( "fecha_inicio", m_fechaInicio.getTime() );
            parametros.put( "fecha_fin", fFin.getTime() );
            parametros.put( "id_usuario", m_iIdUsuario );
            parametros.put( "monto_total", m_dMontoTotal );
            switch ( m_iIdReporte ) {
                case ConstantesWeb.RPT_VENTAS_X_FECHA_Y_USUARIO:
                    jasper = "/WEB-INF/reportes/rpt_ventas_fecha_usuarios.jasper";
                    break;
                case ConstantesWeb.RPT_VENTAS_X_FECHA_Y_PRODUCTO:
                    jasper = "/WEB-INF/reportes/rpt_ventas_fecha_producto.jasper";
                    break;
                default:
                    jasper = "";
                    break;
            }

//
//            if ( data.toString().equals( "boleta_notas.pdf" ) ) {
////                parametros.put( "alu_codigo", m_alumno.getAluCodigo() );
////                parametros.put( "sem_id", m_acSemestreAnterior.getSemId().toString() );
//                jasper = "/WEB-INF/reportes/rep_boleta_notas_codigo.jasper";
//            } else {
////                parametros.put( "mat_id", m_iMatId );
//                jasper = "/WEB-INF/reportes/ficha_matricula.jasper";
//            }
//            parametros.put( "logo", context.getExternalContext().getResource( "/images/logo_uch.jpg" ) );
//            jasper = "/WEB-INF/reportes/prueba_report.jasper";

            print = new Print();

            buffer = print.cargarReporte( jasper, parametros );
            print.cerrarConexion();
            abBytes = buffer.toByteArray();

            input = new ByteArrayInputStream( abBytes );

            iSize = input.available();
            abPdf = new byte[ iSize ];
            input.read( abPdf );
            out.write( abPdf );

            buffer.flush();
            buffer.close();
            input.close();
            out.flush();
            out.close();
        } catch ( Exception ex ) {
            ex.printStackTrace();
        }
    }
}